#include <array>
#include <iostream>
#include <ostream>
#include "priority_queue.h"
#include <queue>
using namespace std;

// // 整形才能做非类型模板参数，C++20才支持别的类型
// template<class T = int, size_t N = 100>
// #define N 1000
// class Stack
// {
// private:
//     T a_[N];
//     int top_;
//     int capacity_;
// };

// int main()
// {
//     Stack<int, 10> s1;   // 10
//     Stack<int, 1000> s2; // 1000
//     Stack<int> s3;       // 100
//     Stack<> s4;          // 100
//     return 0;
// }

// int main()
// {
//     array<int, 10> a1;
//     a1[0] = 10;
//     a1[9] = 100;
//     for (auto &e : a1)
//         cout << e << " ";
//     cout << endl;
//     return 0;
// }

// int main()
// {
//     array<int, 10> a1;
//     a1.fill(1);
//     for (auto &e : a1)
//         cout << e << " ";
//     cout << endl;
//     return 0;
// }

// // 函数模板 -- 参数匹配
// template<class T>
// bool Less(T left, T right)
// {
//     return  left < right;
// }

// // 特化
// template<>
// bool Less<double *>(double *left, double *right)
// {
//     return *left < *right;
// }
// int main()
// {
//     cout << Less(1, 2) << endl;
//     double *p1 = new double(2.2);
//     double *p2 = new double(1.1);
//     cout << Less(p1, p2) << endl;

//     string *p3 = new string("111");
//     string *p4 = new string("222");
//     cout << Less(p3, p4) << endl;
//     return 0;
// }

// // 函数模板 -- 参数匹配
// template<class T>
// bool Less(const T &left, const T &right)
// {
//     return left < right;
// }

// // 特化
// template<>
// bool Less<double *>(double *const &left, double *const &right)
// {
//     return *left < *right;
// }

// int main()
// {
//     cout << Less(1, 2) << endl;
//     double *p1 = new double(2.2);
//     double *p2 = new double(1.1);
//     cout << Less(p1, p2) << endl;

//     string *p3 = new string("111");
//     string *p4 = new string("222");
//     cout << Less(p3, p4) << endl;
//     return 0;
// }

// template<class T1, class T2>
// class Data
// {
// public:
//     Data()
//     {
//         cout << "Data<T1, T2>" << endl;
//     }
//     void f()
//     {}

// private:
//     T1 d1_;
//     T2 d2_;
// };

// // 全特化
// template<>
// class Data<int, char>
// {
// public:
//     Data()
//     {
//         cout << "Data<int, char>" << endl;
//     }
// };

// // 偏特化
// // 特化部分参数
// template<class T1>
// class Data<T1, char>
// {
// public:
//     Data()
//     {
//         cout << "Data<T1, char>" << endl;
//     }
// };

// // 对参数进一步的限制
// template<class T1, class T2>
// class Data<T1 *, T2 *>
// {
// public:
//     Data()
//     {
//         cout << "Data<T1*, T2*>" << endl;
//     }
//     void f()
//     {
//         T1 x1;
//         cout << typeid(x1).name() << endl;
//         T1 *x2;
//         cout << typeid(x2).name() << endl;
//     }
// };

// template<class T1, class T2>
// class Data<T1 &, T2 &>
// {
// public:
//     Data()
//     {
//         cout << "Data<T1&, T2&>" << endl;
//     }
//     void f()
//     {
//         T1 x1;
//         cout << typeid(x1).name() << endl;
//         T1 *x2;
//         cout << typeid(x2).name() << endl;
//     }
// };

// template<class T1, class T2>
// class Data<T1 *, T2 &>
// {
// public:
//     Data()
//     {
//         cout << "Data<T1*, T2&>" << endl;
//     }
//     void f()
//     {
//         T1 x1;
//         cout << typeid(x1).name() << endl;
//         T1 *x2;
//         cout << typeid(x2).name() << endl;
//     }
// };

// int main()
// {
//     Data<int, int> d1;
//     d1.f();

//     Data<int, char> d2;

//     Data<char, char> d3;

//     Data<char *, char *> d4;
//     Data<int *, int *> d5;
//     Data<double *, double *> d6;
//     d4.f();

//     Data<double &, double &> d7;
//     Data<double *, double &> d8;
//     return 0;
// }

// int main()
// {
//     // 显示实现仿函数控制比较逻辑
//     // canoe::priority_queue<Date *, vector<Date *>, PDateLess> q1;
//     canoe::priority_queue<Date *> q1;
//     q1.push(new Date(2018, 10, 29));
//     q1.push(new Date(2018, 10, 28));
//     q1.push(new Date(2018, 10, 30));

//     canoe::priority_queue<int *> q2;
//     q2.push(new int(3));
//     q2.push(new int(1));
//     q2.push(new int(2));

//     while (!q2.empty())
//     {
//         cout << *q2.top() << " ";
//         q2.pop();
//  
//     cout << endl;
//     return 0;
// }

int main()
{
    
    return 0;
}